package cl.tinet.reservaCD.usuario;

import java.util.ArrayList;

import javax.annotation.PostConstruct;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;

import cl.tinet.reservaCD.exception.UsuarioExisteException;
import cl.tinet.reservaCD.exception.UsuarioNoExisteException;
import cl.tinet.reservaCD.exception.UsuarioPassworIncorrectaException;
import cl.tinet.reservaCD.modelo.Usuario;

/**
 * Clase bean del usuario.
 * 
 * @author Carlo Duque
 */
@Stateless(mappedName = "beanUsuario", name = "beanUsuario")
public class UsuarioBeanImpl implements UsuarioBean {

    /**
     * Manejador de entidad y contexto de persistencia de los datos.
     */
    @PersistenceContext(unitName = "MySqlDS")
    private EntityManager em;
    /**
     * Instancia de usuario Dao.
     */
    private UsuarioDao daoUsuario;

    /**
     * Instanciador de nuevo Entity Manager para cada acceso a la clase.
     */
    @PostConstruct
    public void init() {
        daoUsuario = new UsuarioDaoImpl(em);
    }

    /**
     * {@inheritDoc}
     * 
     * @throws UsuarioNoExisteException
     */
    public void crearUsuario(Usuario usuarioCrear)
            throws UsuarioExisteException {

        Usuario usuarioBuscar = buscarUsuario(usuarioCrear);
        if (usuarioBuscar != null) {
            throw new UsuarioExisteException(
                    UsuarioExisteException.USARIO_EXISTE);
        } else {
            daoUsuario.crearUsuario(usuarioCrear);
        }
    }

    /**
     * {@inheritDoc}
     */
    public void eliminarUsuario(Usuario usuarioEliminar)
            throws UsuarioNoExisteException {

        Usuario usuarioBuscar = buscarUsuario(usuarioEliminar);

        if (usuarioBuscar != null) {
            daoUsuario.eliminarUsuario(usuarioBuscar);
        } else {
            throw new UsuarioNoExisteException(
                    UsuarioNoExisteException.USARIO_NO_EXISTE);
        }

    }

    /**
     * {@inheritDoc}
     */
    public void actualizarUsuario(Usuario usuarioActualizar)
            throws UsuarioNoExisteException {

        Usuario usuarioBuscar = buscarUsuario(usuarioActualizar);

        if (usuarioBuscar != null) {
            daoUsuario.actualizarUsuario(usuarioActualizar);
        } else {
            throw new UsuarioNoExisteException(
                    UsuarioNoExisteException.USARIO_NO_EXISTE);
        }

    }

    /**
     * {@inheritDoc}
     */
    public Usuario buscarUsuario(Usuario usuarioBusqueda) {

        Usuario usuario = null;
        try {
            usuario = daoUsuario.buscarUsuario(usuarioBusqueda);
        } catch (NoResultException e) {
            System.out.println("Usuario No existe");
        }

        return usuario;
    }

    /**
     * {@inheritDoc}
     */
    public ArrayList<Usuario> listaUsuario() {
        return daoUsuario.listaUsuario();
    }

    /**
     * {@inheritDoc}
     * 
     * @throws UsuarioPassworIncorrectaException
     *             passwors no valida.
     */
    public Usuario validarUsuario(Usuario usuarioValidar)
            throws UsuarioPassworIncorrectaException {

        Usuario usuario = null;
        try {
            usuario = daoUsuario.validarUsuario(usuarioValidar);
        } catch (NoResultException e) {
            throw new UsuarioPassworIncorrectaException(
                    UsuarioPassworIncorrectaException.PASSWORD_INVALIDA);
        }

        return usuario;
    }

}
